package com.ruoyi.system.service.impl;

import com.ruoyi.common.modbus.data.MiiHmDeviceData;
import com.ruoyi.system.domain.IotVariable;
import com.ruoyi.system.domain.IotVariableValue;
import com.ruoyi.system.domain.vo.IotDeviceVo;
import com.ruoyi.system.domain.vo.IotVariableVo;
import com.ruoyi.system.mapper.IotDeviceMapper;
import com.ruoyi.system.service.IIotTestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.List;


@Slf4j
@Service
public class IotTestServiceImpl implements IIotTestService {

    @Autowired
    private IotDeviceMapper iotDeviceMapper;

    @Override
    public void testData() {
//        MiiHmDeviceData data = (MiiHmDeviceData) message.data();
        String data = "0001000041550e3000000000000000000000000000000000000000000000000000000000000000000000000000000000000041b5538e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
        IotDeviceVo iotDeviceVo = iotDeviceMapper.queryIotDeviceBySnAndAddr("00500824031100020049", 1);
        if (iotDeviceVo == null) {
            return;
        }
        List<IotVariableVo> iotVariableVoList = iotDeviceMapper.variableList(iotDeviceVo.getTemplatesId());

        iotVariableVoList.sort(Comparator.comparingInt(IotVariable::getSerialNum));
        List<Integer> minDataFormatList = Arrays.asList(1, 2, 3);
        List<Integer> maxDataFormatList = Arrays.asList(4, 5);
        for (IotVariableVo iotVariableVo :iotVariableVoList ) {
//        for (int i = 0; i < iotVariableVoList.size(); i++) {
            String valueHex;// = data.data().substring(dataLength * i, dataLength * (i + 1));
            if (maxDataFormatList.contains(iotVariableVo.getDataFormatValue())) {
                valueHex = data.substring((iotVariableVo.getSerialNum() - 1) * 4, ((iotVariableVo.getSerialNum() - 1) * 4) + 8);
            } else {
                valueHex = data.substring((iotVariableVo.getSerialNum() - 1) * 4, ((iotVariableVo.getSerialNum() - 1) * 4) + 4);
            }
            log.info("变量名称："+iotVariableVo.getVariableName()+"，变量值："+valueHex);
            String value;
            // 整数
            if (iotVariableVo.getNumberFormatValue() == 0) {
//                16位 无符号	1
//                16位 有符号	2
//                16位 BCD	3
//                32位浮点数	4
//                32位整数	5
                if (valueHex.equals("00000000") || valueHex.equals("0000")) {
                    value = "0";
                } else {
                    int valueInt = Integer.parseInt(trimTrailingZerosFromHex(valueHex), 16);
                    value = String.valueOf(valueInt);
                }
            } else { // 小数
                if (valueHex.equals("00000000") || valueHex.equals("0000")) {
                    value = "0.0";
                } else {
                    float valueFloat = convertFloat(iotVariableVo.getNumberFormatValue(), valueHex);
                    value = String.valueOf(valueFloat);
                }
            }
            IotVariableValue iotVariableValue = new IotVariableValue();
            iotVariableValue.setIotVariableId(iotVariableVo.getId());
            iotVariableValue.setIotDeviceId(iotDeviceVo.getId());
            iotVariableValue.setVariableValue(value);
            iotVariableValue.setCreateTime(new Date());
            iotVariableValue.setCreateBy("IotDataListener");
            iotVariableValue.setUpdateTime(new Date());
            iotVariableValue.setUpdateBy("IotDataListener");
//            iotVariableValueMapper.insertIotVariableValue(iotVariableValue);
        }
    }

    private float convertFloat(int scale, String valueHex) {
        int intBits = Integer.parseInt(valueHex, 16);
        Float value = Float.intBitsToFloat(intBits);
        BigDecimal bd = BigDecimal.valueOf(value).setScale(scale, RoundingMode.HALF_UP);
        return bd.floatValue();
    }

    public static String trimTrailingZerosFromHex(String hex) {
        return hex.replaceFirst("0+(?=0$|$)", "");
    }

}
